home *** CD-ROM | disk | FTP | other *** search
- /*Includes standard*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- /*Dclaration des fonctions*/
- void howto(void);
- int main(int,char **);
- int diff(char *,char *);
- int reduct(char *);
- int crcheck(char *);
- void umsg(char *,char *);
-
- /*Dclaration des fonctions externes*/
- extern int crc16file(char *name);
-
- /*Quelques constantes fort utiles*/
- #define OK 0
- #define ERROR (-1)
- #define FALSE 0
- #define TRUE 1
-
- /*Dclaration des variables*/
- FILE *logf;
- char str[255];
- char str2[255];
- char domain[50];
- char misc[150];
- char nnod[255];
- int zone=0;
- int region=0;
- int net=0;
- int hub=0;
-
- /*Dclaration des variables externes*/
- extern unsigned int fcrc;
-
- /*Fonction principale*/
- int main(int argc,char **argv)
- {
- int err;
-
- /*Affichage des infos*/
- printf("InterDiff v1.00 Beta 1\n(c) 1995, Nicolas LONG\n");
- printf("Ce logiciel est diffus selon les termes de la license publique GNU.\n");
- printf("Il est ddi aux utilisateurs d'Intermde BBS.\n");
- printf("Merci
Philippe Orand pour son aide prcieuse !\n---\n\n");
-
- logf=fopen("INTERDIF.LOG","a");
- fprintf(logf,"---\n");
-
- /*Si il y a plus de 1 token dans la ligne de cmd*/
- if(argc>1)
- {
- if(!strcmp(*(argv+1),"-diff") && *(argv+2)!=NULL && *(argv+3)!=NULL)
- {
- umsg("Commande","-diff");
-
- err=diff(*(argv+2),*(argv+3)); /*On applique le diff*/
- fclose(logf);
- return(err);
- }
-
- if(!strcmp(*(argv+1),"-ver") && *(argv+2)!=NULL)
- {
- umsg("Commande","-ver");
-
- err=crcheck(*(argv+2)); /*On vrifie le CRC16*/
- fclose(logf);
- return(err);
- }
-
- /*Rduction de nodelist*/
- if(!strcmp(*(argv+1),"-red") && *(argv+2)!=NULL)
- {
- umsg("Commande","-red");
-
- /*Vrification des paramtres*/
- if(!strcmp(*(argv+2),"-z") && *(argv+3)!=NULL)
- sscanf(*(argv+3),"%d",&zone);
-
- /*Si la zone est cohrente*/
- if(zone>0 && *(argv+4)!=NULL)
- {
- /*Si une rgion est spcifie*/
- if(!strcmp(*(argv+4),"-r") && *(argv+5)!=NULL)
- sscanf(*(argv+5),"%d",®ion);
- /*Sinon rduction en nodelist de zone*/
- else if(*(argv+4)[0]!='-')
- {
- err=reduct(*(argv+4));
- fclose(logf);
- return(err);
- }
- }
-
- if((region>0 || net>0) && *(argv+6)!=NULL)
- {
- /*Rduction en nodelist de rgion*/
- if(*(argv+6)[0]!='-')
- {
- err=reduct(*(argv+6));
- fclose(logf);
- return(err);
- }
- }
- }
- /*Affiche le mode d'emploi en cas de mauvais format des paramtres*/
- howto();
- fclose(logf);
- return(ERROR);
- }
-
- /*Affichage du mode d'emploi*/
- else
- {
- howto();
- fclose(logf);
- return(ERROR);
- }
- }
-
- int diff(char *dif,char *oldnod)
- {
- /*Dclaration des variables locales*/
- FILE *df;
- FILE *of;
- FILE *nf;
- int i,j,cnt,ver;
- char c;
-
- if((df=fopen(dif,"rb"))==NULL) /*Ouverture du fichier diff*/
- {
- umsg("Erreur
l'ouverture de la nodediff:",strerror(errno));
- return ERROR;
- }
-
- if((of=fopen(oldnod,"rb"))==NULL) /*Ouverture de la vieille nodelist*/
- {
- umsg("Erreur
l'ouverture de la nodelist :",strerror(errno));
- return ERROR;
- }
-
- strcpy(str,dif); /*Recherche du numro de version du diff*/
- for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
- str[i+4]=0;
- sscanf(&(str[i+1]),"%d",&ver);
-
- strcpy(str,oldnod); /*Gnration du chemin d'accs
la nouvelle nodelist*/
- for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
- str[i+1]=0;
- sprintf(nnod,"%s%03d",str,ver);
-
- if((nf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
- {
- umsg("Erreur
l'ouverture de la nodelist:",strerror(errno));
- return ERROR;
- }
-
- fgets(str,255,df); /*Lecture des lignes de controle*/
- fgets(str2,255,of);
- fseek(of,0,SEEK_SET);
-
- if(strcmp(str,str2)) /*Controle*/
- {
- umsg("Nodediff et Nodelist ne se correspondent pas","");
- return(ERROR);
- }
-
- umsg("Gnration de la nodelist:",nnod);
- printf("Veuillez patienter...\n");
-
- while(fgets(str,255,df)!=NULL)
- {
- if(str[0]=='A') /*Ajout de lignes*/
- {
- sscanf(str+1,"%d",&cnt);
- for(j=0;j<cnt;j++)
- {
- fgets(str,255,df);
- fputs(str,nf);
- }
- }
-
- else if(str[0]=='D') /*Effacement de lignes*/
- {
- sscanf(str+1,"%d",&cnt);
- for(j=0;j<cnt;j++)
- {
- fgets(str,255,of);
- }
- }
-
- else if(str[0]=='C') /*Copie de lignes*/
- {
- sscanf(str+1,"%d",&cnt);
- for(j=0;j<cnt;j++)
- {
- fgets(str,255,of);
- fputs(str,nf);
- }
- }
- }
-
- c=26;
- fwrite(&c,1,1,nf);
-
- fclose(of); /*Fermeture des fichiers*/
- fclose(df);
- fclose(nf);
-
- umsg("Nouvelle Nodelist gnre avec succs","");
- return OK;
- }
-
- /*Rduction de nodelist*/
- int reduct(char *nodel)
- {
- /*Dclaration des variables locales*/
- FILE *nf;
- FILE *rf;
- char *cpt;
- char *cpt2;
- char *ex;
- char c;
- int i,ver;
- int fpos,fpos2;
-
- if((nf=fopen(nodel,"rb"))==NULL) /*Ouverture de la nodelist*/
- {
- umsg("Erreur
l'ouverture de la nodelist:",strerror(errno));
- return ERROR;
- }
-
- strcpy(str,nodel); /*Recherche du numro de version*/
- for(i=strlen(str)-1;str[i]!='.' && i>=0;i--);
- str[i+4]=0;
- sscanf(&(str[i+1]),"%d",&ver);
-
- /*Gnration du nom de la nodelist rduite*/
- strcpy(str,nodel);
- for(i=strlen(str)-1;str[i]!='\\' && str[i]!='/' && i>=0;i--)
- str[i]=0;
- sprintf(nnod,"%s%s_%d.%03d",str,region ? "reg" : "zone",region ? region : zone);
- umsg("Gnration de la nodelist rduite",nnod);
-
- if((rf=fopen(nnod,"wb"))==NULL) /*Ouverture de la nouvelle nodelist*/
- {
- umsg("Erreur
l'ouverture de la nodelist:",strerror(errno));
- return ERROR;
- }
-
- /*Analyse de la premire ligne de la nodelist*/
- fscanf(nf,";A %s Nodelist",domain); /*Nom du rseau*/
- umsg("Rseau:",domain);
-
- /*Gnration de la nouvelle ligne d'en-tte*/
- sprintf(domain,"%s_%s_%d",domain,region ? "Region" : "Zone",region ? region : zone);
- fgets(str,255,nf);
- cpt=strtok(str,":");
- sprintf(str2,";A %s Nodelist%s: %u\xD\xA",domain,cpt,12345U);
- fputs(str2,rf); /*Ecriture*/
-
- /*Signature du logiciel*/
- fprintf(rf,";A Reduced Nodelist generated by InterDiff v1.00\xD\xA");
- fprintf(rf,";A (c) 1995, by Nicolas Long at Intermde BBS, 2:323/13.16\xD\xA;\xD\xA",rf);
-
- /*Recherche de la zone
traiter dans la nodelist*/
- do
- {
- do
- {
- ex=fgets(str,255,nf);
- }while(str[0]==';' && ex!=0); /*On saute les commentaires*/
- cpt=strtok(str,",");
- }while(strcmp(cpt,"Zone") || atoi(strtok(NULL,","))!=zone);
-
- str[strlen(str)]=',';
-
- /*Ecriture des nodes indpendants de la zone (jusqu'
la premire rgion)*/
- do
- {
- if(str[0]!=';')
- str[strlen(str)]=',';
- fputs(str,rf);
- do
- {
- ex=fgets(str,255,nf);
- }while(str[0]==';' && str[1]>16 && ex!=0);
- cpt=strtok(str,",");
- }while(strcmp(cpt,"Region") && ex!=0);
-
- /*Si on fait une nodelist de rgion*/
- if(region>0)
- {
- /*Recherche de la rgion*/
- do
- {
- do
- {
- ex=fgets(str,255,nf);
- }while(str[0]==';' && ex!=0);
- cpt=strtok(str,",");
- }while(strcmp(cpt,"Region") || atoi(strtok(NULL,","))!=region);
-
- str[strlen(str)]=',';
-
- /*Ecriture des nodes de la region*/
- do
- {
- if(str[0]!=';')
- str[strlen(str)]=',';
- fputs(str,rf);
- do
- {
- ex=fgets(str,255,nf);
- }while(str[0]==';' && str[1]>16 && ex!=0);
- cpt=strtok(str,",");
- }while(strcmp(cpt,"Region") && strcmp(cpt,"Zone") && ex!=0);
- }
-
- /*Si on fait une nodelist de zone*/
- else
- {
- /*Ecriture des nodes de la zone*/
- do
- {
- if(str[0]!=';')
- str[strlen(str)]=',';
- fputs(str,rf);
- do
- {
- ex=fgets(str,255,nf);
- }while(str[0]==';' && str[1]>16 && ex!=0);
- cpt=strtok(str,",");
- }while(strcmp(cpt,"Zone") && ex!=0);
- }
-
- c=26; /*On ajoute le EOF*/
- fwrite(&c,1,1,rf);
-
- fclose(nf); /*Fermeture des fichiers*/
- fclose(rf);
-
- crc16file(nnod); /*Calcul du CRC16*/
-
- /*On crit aprs coup le CRC dans l'en-tte. Pas trs lgant mais bon...*/
- rf=fopen(nnod,"ab");
- fseek(rf,SEEK_SET,0);
- sprintf(&(str2[strlen(str2)-7]),"%05u\xD\xA",fcrc);
- fputs(str2,rf);
- fclose(rf);
-
- umsg("Nodelist rduite gnre avec succs","");
- return(OK);
- }
-
- /*Vrif du CRC16*/
- int crcheck(char *fname)
- {
- FILE *nf;
- unsigned int crc;
-
- umsg("Vrification du fichier",fname);
-
- if((nf=fopen(fname,"rb"))==NULL) /*Ouverture de la nodelist*/
- {
- umsg("Erreur
l'ouverture de la nodelist:",strerror(errno));
- return ERROR;
- }
-
- fgets(str,255,nf); /*Lecture de la premire ligne*/
- fclose(nf);
- crc=atoi(&(str[strlen(str)-7])); /*Recherche du CRC dans la chaine lue*/
-
- crc16file(fname); /*Calcul du CRC*/
-
- /*Comparaison des CRC*/
- umsg(crc==fcrc ? "Test CRC Ok" : "Mauvais CRC","");
-
- return(OK);
- }
-
- void howto(void)
- {
- umsg("Mauvais format des paramtres !","(voir INTERDIF.DOC)");
- }
-
- /*Affichage de messages*/
- void umsg(char *msgh,char *msgt)
- {
- printf("%s %s\n",msgh,msgt);
- fprintf(logf,"%s %s\n",msgh,msgt);
- }
-